import java.util.*;

/**
 * Created with IntelliJ IDEA.
 * Description:
 * User: 23735
 * Date: 2022-12-07
 * Time: 22:15
 */
class TreeNode {
    int val;
    TreeNode left;
    TreeNode right;
    TreeNode() {}
    TreeNode(int val) { this.val = val; }
    TreeNode(int val, TreeNode left, TreeNode right) {
        this.val = val;
        this.left = left;
        this.right = right;
    }
}

public class Main{

    public static int count;//记录输出的值的个数,方便控制输出格式

    //层序遍历,层序遍历就是从上到下,从左到右
    public static void levelOrder(TreeNode root){
        if(root==null){
            return ;
        }
        Queue<TreeNode> queue=new LinkedList<>();
        queue.add(root);
        while(!queue.isEmpty()){
            //弹出一个节点的同时将该节点的左右节点放进去
            TreeNode peek=queue.poll();
            if(peek.left!=null){
                queue.add(peek.left);
            }
            if(peek.right!=null){
                queue.add(peek.right);
            }

            //只有是叶子节点时才输出
            if(peek.left==null&&peek.right==null){
                //输出同时注意格式
                if(count==0){
                    System.out.print(peek.val);
                }else{
                    System.out.print(" "+peek.val);
                }
                count++;
            }
        }
    }

    public static void main(String[] args) {
        Map<Integer,TreeNode> map=new HashMap<>();//存储节点的值以及节点,方便根据输入的值构造树
        Scanner scanner=new Scanner(System.in);
        TreeNode temp=null;
        int num=scanner.nextInt();

        //一个数组,用来最后找头节点
        //用一个数组标记哪个节点有父亲节点,从而最后那个没有父亲节点的就是头节点
        int[] arr=new int[num];
        for (int i = 0; i < num; i++) {
            arr[i]=1;//初始值都为1,  1 代表没有父亲节点,0 代表有
        }

        //根据输入构建树
        for (int i = 0; i < num; i++) {
            //先判断该编号对应的节点是否已经创建了
            if (map.containsKey(i)) {
                //该节点已经创建过了
                temp = map.get(i);
            } else {
                //该节点没有创建就创建并放到map中
                temp = new TreeNode(i);
                map.put(i, temp);
            }

            //再连接该节点的左右子树
            String left = scanner.next();
            String right = scanner.next();
            //左节点
            if (!left.equals("-")) {
                int leftValue = Integer.parseInt(left);
                arr[leftValue] = 0;//标记一下该节点有父亲节点
                if (map.containsKey(leftValue)) {
                    //左节点已经创建过了
                    temp.left = map.get(leftValue);
                } else {
                    TreeNode leftNode=new TreeNode(leftValue);
                    //左节点没有创建就创建同时也添加到map中
                    temp.left = leftNode;
                    map.put(leftValue,leftNode);
                }
            }
            //右节点
            if (!right.equals("-")) {
                int rightValue = Integer.parseInt(right);
                arr[rightValue] = 0;//标记一下该节点有父亲节点
                if (map.containsKey(rightValue)) {
                    //右节点已经创建过了
                    temp.right = map.get(rightValue);
                } else {
                    //右节点没有创建就创建同时也添加到map中
                    TreeNode rightNode=new TreeNode(rightValue);
                    temp.right = rightNode;
                    map.put(rightValue,rightNode);
                }
            }
        }

        //找头节点
        int head=0;//记录头节点对应的值
        for (int i = 0; i < num; i++) {
            if(arr[i]==1){
                head=i;
            }
        }
        TreeNode root=map.get(head);
        //通过层序遍历,从上到下,从左到右输出这棵树的所有的叶子节点
        levelOrder(root);
    }
}
